package listeObjets;

//
// IUT de Nice / Departement informatique / Module APO-Java
// Annee 2011_2012 - Composants generiques
//
// Classe ControleurMosaiqueG - Controleur d'un panneau organise en cellules
//
// Edition A     : chargement et gestion d'un lot ordonne d'images
//
//    + Version 1.0.0   : version initiale
//    + Version 1.1.0   : ajout de la methode installerImages
//    + Version 1.2.0   : ajout des accesseurs obtenirNbCellules et
//                        obtenirNbImages
//    + Version 1.3.0   : introduction methode publique permuterImages
//                        + ajout accesseur obtenirCheminImage
//    + Version 1.4.0   : ajout methodes publiques ajouterImage,
//                        retirerImage et rassemblerImages
//
// Edition B     : mise en place ecouteurs de mosaique, avec exploitation de
//                 la classe ControleurG version 1.1.0 et superieures
//
//    + Version 2.0.0   : ajout methode publique observerMosaique
//    + Version 2.1.0   : ajout accesseur obtenirPositionCellule
//    + Version 2.2.0   : ajout methode publique observerCellule
//    + Version 2.3.0   : ajout troisieme constructeur
//
// Auteur : V. Pruliere
//

import java.awt.*;
import composantsg.Config;
import composantsg.ControleurG;
import composantsg.ModeleMosaiqueG;
import composantsg.VueMosaiqueG;

import java.util.*;
import java.awt.event.*;

public class ControleurMosaiqueG extends ControleurG implements MouseListener,
		MouseMotionListener {

	private VueMosaiqueG vueSupport;
	private ModeleMosaiqueG modeleSupport;

	// --- Premier constructeur normal

	public ControleurMosaiqueG(Object hamecon, String fichierConfig,
			String versionConfig) throws Throwable {

		// Controler la validite des parametres
		//
		if (hamecon == null)
			throw new Throwable("-2.1");

		// Traiter le cas de l'absence de configuration
		//
		if (fichierConfig == null) {
			vueSupport = new VueMosaiqueG(hamecon);
			return;
		} else if (versionConfig == null)
			throw new Throwable("-2.3");

		// Charger le dictionnaire de configuration
		//
		HashMap config = (HashMap) Config.load(fichierConfig, versionConfig);
		if (config == null)
			throw new Throwable("-3.1");

		// Construire la vue support
		//
		vueSupport = new VueMosaiqueG(hamecon, config);

		// Construire un modele support par defaut
		//
		modeleSupport = new ModeleMosaiqueG();
	}

	// --- Second constructeur normal

	public ControleurMosaiqueG(Object hamecon, String configVue,
			String versionConfig, String cheminImages, String versionImages)
			throws Throwable {

		// Invoquer le premier constructeur
		//
		this(hamecon, configVue, versionConfig);

		// Controler la validite des deux derniers parametres
		//
		if (cheminImages == null)
			throw new Throwable("-2.4");
		if (versionImages == null)
			throw new Throwable("-2.5");

		// Construire le modele support
		//
		modeleSupport = new ModeleMosaiqueG(cheminImages, versionImages);

		// Obtenir le lot courant d'images gerees par le modele
		//
		LinkedHashMap description = modeleSupport.obtenirImages();

		// Installer le lot courant d'images dans la vue
		//
		vueSupport.installerImages(description);
	}

	// --- Troisieme constructeur normal

	public ControleurMosaiqueG(Object hamecon, HashMap config) throws Throwable {

		// Controler la validite des parametres
		//
		if (hamecon == null)
			throw new Throwable("-2.1");
		if (config == null)
			throw new Throwable("-3.1");

		// Construire la vue support
		//
		vueSupport = new VueMosaiqueG(hamecon, config);

		// Construire un modele support par defaut
		//
		modeleSupport = new ModeleMosaiqueG();
	}

	// --- Methode obtenirVue

	public VueMosaiqueG obtenirVue() {
		return vueSupport;
	}

	// --- Methode obtenirModele

	public ModeleMosaiqueG obtenirModele() {
		return modeleSupport;
	}

	// --- Methode obtenirNbLignes

	public int obtenirNbLignes() {
		return vueSupport.obtenirNbLignes();
	}

	// --- Methode obtenirNbColonnes

	public int obtenirNbColonnes() {
		return vueSupport.obtenirNbColonnes();
	}

	// --- Methode obtenirNbImages

	public int obtenirNbImages() {
		return vueSupport.obtenirNbImages();
	}

	// --- Methode obtenirNbCellules

	public int obtenirNbCellules() {
		return vueSupport.obtenirNbCellules();
	}

	// --- Methode obtenirCheminImage

	public String obtenirCheminImage(int ligne, int colonne) throws Throwable {

		// Obtenir les dimensions de la mosaique
		//
		int nbLignes = obtenirNbLignes();
		int nbColonnes = obtenirNbColonnes();

		// Controler la validite des parametres
		//
		if (ligne < 1 || ligne > nbLignes)
			throw new Throwable("-2.1");
		if (colonne < 1 || colonne > nbColonnes)
			throw new Throwable("-2.2");

		// Piloter la vue
		//
		return vueSupport.obtenirCheminImage(ligne, colonne);
	}

	// --- Methode installerImages

	public void installerImages(String cheminImages, String versionImages)
			throws Throwable {

		// Controler la validite des parametres
		//
		if (cheminImages == null)
			throw new Throwable("-2.1");
		if (versionImages == null)
			throw new Throwable("-2.2");

		// Piloter le chargement des images par le modele
		//
		LinkedHashMap description;
		description = modeleSupport.chargerImages(cheminImages, versionImages,
				null);
		// Installer des images dans la vue
		//
		vueSupport.installerImages(description);
	}

	// --- Methode permuterImages

	public void permuterImages(Dimension p1, Dimension p2) throws Throwable {

		// Controler la validite des parametres
		//
		if (p1 == null)
			throw new Throwable("-2.1");
		if (p2 == null)
			throw new Throwable("-2.2");

		// Piloter la vue
		//
		vueSupport.permuterImages(p1, p2);
	}

	// --- Methode ajouterImage

	public boolean ajouterImage(int ligne, int colonne, String cheminImage)
			throws Throwable {

		// Obtenir les dimensions de la mosaique
		//
		int nbLignes = obtenirNbLignes();
		int nbColonnes = obtenirNbColonnes();

		// Controler la validite des parametres
		//
		if (ligne < 1 || ligne > nbLignes)
			throw new Throwable("-2.1");
		if (colonne < 1 || colonne > nbColonnes)
			throw new Throwable("-2.2");
		if (cheminImage == null)
			throw new Throwable("-2.3");

		// Piloter la vue
		//
		return vueSupport.ajouterImage(ligne, colonne, cheminImage);
	}

	// --- Methode retirerImage

	public boolean retirerImage(int ligne, int colonne) throws Throwable {

		// Obtenir les dimensions de la mosaique
		//
		int nbLignes = obtenirNbLignes();
		int nbColonnes = obtenirNbColonnes();

		// Controler la validite des parametres
		//
		if (ligne < 1 || ligne > nbLignes)
			throw new Throwable("-2.1");
		if (colonne < 1 || colonne > nbColonnes)
			throw new Throwable("-2.2");

		// Piloter la vue
		//
		return vueSupport.retirerImage(ligne, colonne);
	}

	// --- Methode rassemblerImages

	public void rassemblerImages() throws Throwable {

		vueSupport.rassemblerImages();
	}

	// --- Methode observerMosaique

	public void observerMosaique(MouseListener c) throws Throwable {

		vueSupport.ajouterControleur(c);
	}

	// --- Methode obtenirPositionCellule

	public Point obtenirPositionCellule(Dimension positionClic)
			throws Throwable {

		if (positionClic == null)
			throw new Throwable("-2.1");

		return vueSupport.obtenirPositionCellule(positionClic);
	}

	// --- Methode observerCellule

	public void observerCellule(int ligne, int colonne, MouseListener c)
			throws Throwable {

		// Obtenir les dimensions de la mosaique
		//
		int nbLignes = obtenirNbLignes();
		int nbColonnes = obtenirNbColonnes();

		// Controler la validite des parametres
		//
		if (ligne < 1 || ligne > nbLignes)
			throw new Throwable("-2.1");
		if (colonne < 1 || colonne > nbColonnes)
			throw new Throwable("-2.2");
		if (c == null)
			throw new Throwable("-2.3");

		// Piloter la vue
		//
		vueSupport.observerCellule(ligne, colonne, c);
	}
}
